﻿using System;
using System.Collections.Generic;
using System.Text;

using System.Data;
using System.Data.Odbc;
using WLMCoreLibrary;

using System.Xml;
using System.Xml.Serialization;
using System.ComponentModel;
using System.CodeDom.Compiler;
using System.Configuration;
using System.IO;

namespace SAW_Core
{
    [Serializable]
    public class Producto : BaseClass
    {
    

        #region public properties
        [XmlAttributeAttribute()]
        public int idMarca { get;set; }
        [XmlAttributeAttribute()]
        public String Modelo { get;set; }
        [XmlAttributeAttribute()]
        public String SKU { get;set; }
        [XmlAttributeAttribute()]
        public String Clave { get;set; }
        [XmlAttributeAttribute()]
        public String Descripcion { get;set; }
        [XmlAttributeAttribute()]
        public Decimal Precio1 { get;set; }
        [XmlAttributeAttribute()]
        public Decimal Precio2 { get;set; }
        [XmlAttributeAttribute()]
        public Decimal Precio3 { get;set; }
        [XmlAttributeAttribute()]
        public Decimal Precio4 { get;set; }
        [XmlAttributeAttribute()]
        public Decimal Precio5 { get;set; }
        [XmlAttributeAttribute()]
        public Decimal Stock { get;set; }
        [XmlAttributeAttribute()]
        public Decimal StockMinimo { get;set; }
        [XmlAttributeAttribute()]
        public Decimal StockMaximo { get;set; }
        [XmlAttributeAttribute()]
        public Decimal UltimoPrecioCompra { get;set; }
        [XmlAttributeAttribute()]
        public Decimal costoPromedio { get;set; }
        [XmlAttributeAttribute()]
        public String UnidadMedida { get;set; }
        [XmlAttributeAttribute()]
        public int idLinea { get;set; }
        [XmlAttributeAttribute()]
        public int idCategoria { get;set; }
        [XmlAttributeAttribute()]
        public Decimal Apartados { get;set; }
        [XmlAttributeAttribute()]
        public Decimal PorSurtir { get;set; }
        [XmlAttributeAttribute()]
        public Decimal Peso { get;set; }
        [XmlAttributeAttribute()]
        public int idImagen { get;set; }
        [XmlAttributeAttribute()]
        public Boolean Activo { get;set; }
        [XmlAttributeAttribute()]
        public Boolean EsMateriaPrima { get;set; }
        [XmlAttributeAttribute()]
        public Boolean EsProductoTerminado
        {
            get;set;
            
        }
        [XmlAttributeAttribute()]
        public Boolean EsPaquete { get;set; }
        [XmlAttributeAttribute()]
        public ProductoCategoria Categoria { get;set;  }
        [XmlAttributeAttribute()]
        public ProductoLinea Linea { get;set;  }
        [XmlAttributeAttribute()]
        public ProductoMarca Marca { get;set; }
        [XmlAttributeAttribute()]
        public int id2 { get;set; }

        public List<ProductoStock> ListaStock { get;set; }

        #endregion

        #region constructors
        public Producto()
        {
        }

        public Producto(ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            WLMClassBinder classBinder = new WLMClassBinder(ref ConexionDB);
            id = classBinder.NewRecord("PRODUCTOS");
            string queryString = "";
            queryString = "SELECT * FROM PRODUCTOS WHERE id='" + this.id + "'";
            GetRecord(queryString);
        }

        public Producto(int registryId,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM PRODUCTOS WHERE id='" + registryId + "'";

            this.GetRecord(queryString);
        }

        public Producto(string barcode, ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM PRODUCTOS WHERE Clave='" + barcode + "'";

            this.GetRecord(queryString);
        }

        public Producto(int registryId, bool loadFullInfo,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM PRODUCTOS WHERE id='" + registryId + "'";

            this.GetRecord(queryString);
            if (loadFullInfo)
            {
                Categoria = new ProductoCategoria(idCategoria,ref ConexionDB);
                Linea = new ProductoLinea(idLinea,ref ConexionDB);
                Marca = new ProductoMarca(idMarca,ref ConexionDB);
                ListaStock = new List<ProductoStock>();


            }
        }

        public Producto(int registryId, bool loadFullInfo, bool incluirIVA,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM PRODUCTOS WHERE id='" + registryId + "'";

            this.GetRecord(queryString);
            if (incluirIVA)
            {
                Precio1 *= 1.16M;
                Precio2 *= 1.16M;
                Precio3 *= 1.16M;
                Precio4 *= 1.16M;
                Precio5 *= 1.16M;
            }
            if (loadFullInfo)
            {
                Categoria = new ProductoCategoria(idCategoria,ref ConexionDB);
                Linea = new ProductoLinea(idLinea,ref ConexionDB);
                Marca = new ProductoMarca(idMarca,ref ConexionDB);
            }
        }


        public Producto(DataRow dataRow,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            this.GetRecord(dataRow);
        }
        #endregion

        #region public methods


        public void Delete()
        {
            ////string queryString = "";
            ////queryString = "DELETE FROM PRODUCTOS WHERE id='" + this.id + "'";
            ////ConexionDBInterna.ExecuteCommand(queryString);
            Activo = false;
            Save();
        }
        #endregion


        #region Private Methods
        private void GetRecord(string queryString)
        {
            OdbcDataReader reader = ConexionDBInterna.ExecuteReader(queryString);
            if (reader.HasRows)
            {
                if (!reader.IsDBNull(reader.GetOrdinal("id")))
                    id = (System.Int32)reader["id"];
                if (!reader.IsDBNull(reader.GetOrdinal("fechaCreacion")))
                    fechaCreacion = Convert.ToDateTime(reader["fechaCreacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("fechaModificacion")))
                    fechaModificacion = Convert.ToDateTime(reader["fechaModificacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuario")))
                    idUsuario = (System.Int32)reader["idUsuario"];
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuarioModificacion")))
                    idUsuarioModificacion = (System.Int32)reader["idUsuarioModificacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("idMarca")))
                    idMarca = (System.Int32)reader["idMarca"];
                if (!reader.IsDBNull(reader.GetOrdinal("Modelo")))
                    Modelo = (System.String)reader["Modelo"];
                if (!reader.IsDBNull(reader.GetOrdinal("SKU")))
                    SKU = (System.String)reader["SKU"];
                if (!reader.IsDBNull(reader.GetOrdinal("Clave")))
                    Clave = (System.String)reader["Clave"];
                if (!reader.IsDBNull(reader.GetOrdinal("Descripcion")))
                    Descripcion = (System.String)reader["Descripcion"];
                if (!reader.IsDBNull(reader.GetOrdinal("Precio1")))
                    Precio1 = (System.Decimal)reader["Precio1"];
                if (!reader.IsDBNull(reader.GetOrdinal("Precio2")))
                    Precio2 = (System.Decimal)reader["Precio2"];
                if (!reader.IsDBNull(reader.GetOrdinal("Precio3")))
                    Precio3 = (System.Decimal)reader["Precio3"];
                if (!reader.IsDBNull(reader.GetOrdinal("Precio4")))
                    Precio4 = (System.Decimal)reader["Precio4"];
                if (!reader.IsDBNull(reader.GetOrdinal("Precio5")))
                    Precio5 = (System.Decimal)reader["Precio5"];
                if (!reader.IsDBNull(reader.GetOrdinal("Stock")))
                    Stock = (System.Decimal)reader["Stock"];
                if (!reader.IsDBNull(reader.GetOrdinal("StockMinimo")))
                    StockMinimo = (System.Decimal)reader["StockMinimo"];
                if (!reader.IsDBNull(reader.GetOrdinal("StockMaximo")))
                    StockMaximo = (System.Decimal)reader["StockMaximo"];
                if (!reader.IsDBNull(reader.GetOrdinal("UltimoPrecioCompra")))
                    UltimoPrecioCompra = (System.Decimal)reader["UltimoPrecioCompra"];
                if (!reader.IsDBNull(reader.GetOrdinal("costoPromedio")))
                    costoPromedio = (System.Decimal)reader["costoPromedio"];
                if (!reader.IsDBNull(reader.GetOrdinal("UnidadMedida")))
                    UnidadMedida = (System.String)reader["UnidadMedida"];
                if (!reader.IsDBNull(reader.GetOrdinal("idLinea")))
                    idLinea = (System.Int32)reader["idLinea"];
                if (!reader.IsDBNull(reader.GetOrdinal("idCategoria")))
                    idCategoria = (System.Int32)reader["idCategoria"];
                if (!reader.IsDBNull(reader.GetOrdinal("Apartados")))
                    Apartados = (System.Decimal)reader["Apartados"];
                if (!reader.IsDBNull(reader.GetOrdinal("idImagen")))
                    idImagen = (System.Int32)reader["idImagen"];
                if (!reader.IsDBNull(reader.GetOrdinal("Activo")))
                    Activo = Convert.ToBoolean(reader["Activo"]);
                if (!reader.IsDBNull(reader.GetOrdinal("EsMateriaPrima")))
                    EsMateriaPrima = Convert.ToBoolean(reader["EsMateriaPrima"]);
                if (!reader.IsDBNull(reader.GetOrdinal("EsProductoTerminado")))
                    EsProductoTerminado = Convert.ToBoolean(reader["EsProductoTerminado"]);
                if (!reader.IsDBNull(reader.GetOrdinal("EsPaquete")))
                    EsPaquete = Convert.ToBoolean(reader["EsPaquete"]);
                if (!reader.IsDBNull(reader.GetOrdinal("porSurtir")))
                    PorSurtir = (System.Decimal)reader["porSurtir"];
                if (!reader.IsDBNull(reader.GetOrdinal("peso")))
                    Peso = (System.Decimal)reader["peso"];
                if (!reader.IsDBNull(reader.GetOrdinal("id2")))
                    id2 = (System.Int32)reader["id2"];
            }
        }


        private void GetRecord(DataRow dataRow)
        {
            if (dataRow != null)
            {
                if (dataRow["id"] != null)
                    id = (System.Int32)dataRow["id"];
                if (dataRow["fechaCreacion"] != null)
                    fechaCreacion = (System.DateTime)dataRow["fechaCreacion"];
                if (dataRow["fechaModificacion"] != null)
                    fechaModificacion = (System.DateTime)dataRow["fechaModificacion"];
                if (dataRow["idUsuario"] != null)
                    idUsuario = (System.Int32)dataRow["idUsuario"];
                if (dataRow["idUsuarioModificacion"] != null)
                    idUsuarioModificacion = (System.Int32)dataRow["idUsuarioModificacion"];
                if (dataRow["idMarca"] != null)
                    idMarca = (System.Int32)dataRow["idMarca"];
                if (dataRow["Modelo"] != null)
                    Modelo = (System.String)dataRow["Modelo"];
                if (dataRow["SKU"] != null)
                    SKU = (System.String)dataRow["SKU"];
                if (dataRow["Clave"] != null)
                    Clave = (System.String)dataRow["Clave"];
                if (dataRow["Descripcion"] != null)
                    Descripcion = (System.String)dataRow["Descripcion"];
                if (dataRow["Precio1"] != null)
                    Precio1 = (System.Decimal)dataRow["Precio1"];
                if (dataRow["Precio2"] != null)
                    Precio2 = (System.Decimal)dataRow["Precio2"];
                if (dataRow["Precio3"] != null)
                    Precio3 = (System.Decimal)dataRow["Precio3"];
                if (dataRow["Precio4"] != null)
                    Precio4 = (System.Decimal)dataRow["Precio4"];
                if (dataRow["Precio5"] != null)
                    Precio5 = (System.Decimal)dataRow["Precio5"];
                if (dataRow["Stock"] != null)
                    Stock = (System.Decimal)dataRow["Stock"];
                if (dataRow["StockMinimo"] != null)
                    StockMinimo = (System.Decimal)dataRow["StockMinimo"];
                if (dataRow["StockMaximo"] != null)
                    StockMaximo = (System.Decimal)dataRow["StockMaximo"];
                if (dataRow["UltimoPrecioCompra"] != null)
                    UltimoPrecioCompra = (System.Decimal)dataRow["UltimoPrecioCompra"];
                if (dataRow["costoPromedio"] != null)
                    costoPromedio = (System.Decimal)dataRow["costoPromedio"];
                if (dataRow["UnidadMedida"] != null)
                    UnidadMedida = (System.String)dataRow["UnidadMedida"];
                if (dataRow["idLinea"] != null)
                    idLinea = (System.Int32)dataRow["idLinea"];
                if (dataRow["idCategoria"] != null)
                    idCategoria = (System.Int32)dataRow["idCategoria"];
                if (dataRow["Apartados"] != null)
                    Apartados = (System.Decimal)dataRow["Apartados"];
                if (dataRow["idImagen"] != null)
                    idImagen = (System.Int32)dataRow["idImagen"];
                if (dataRow["Activo"] != null)
                    Activo = (bool)dataRow["Activo"];
                if (dataRow["EsMateriaPrima"] != null)
                    EsMateriaPrima = (bool)dataRow["EsMateriaPrima"];
                if (dataRow["EsProductoTerminado"] != null)
                    EsProductoTerminado = (bool)dataRow["EsProductoTerminado"];
                if (dataRow["EsPaquete"] != null)
                    EsPaquete = (bool)dataRow["EsPaquete"];
                if (dataRow["peso"] != null)
                    Peso = (System.Decimal)dataRow["peso"];
                if (dataRow["porSurtir"] != null)
                    PorSurtir = (System.Decimal)dataRow["porSurtir"];
                if (dataRow["id2"] != null)
                    id2 = (System.Int32)dataRow["id2"];
            }
        }


        protected override void UpdateBind()
        {
            StringBuilder strCommand = new StringBuilder();
            strCommand.Append("UPDATE PRODUCTOS set ");
            strCommand.Append("fechaModificacion='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",idUsuarioModificacion='" + this.idUsuarioModificacion.ToString() + "'");
            strCommand.Append(",idMarca='" + this.idMarca.ToString() + "'");
            strCommand.Append(",Modelo=\"" + WLMFunctions.comillas(Modelo) + "\"");
            strCommand.Append(",SKU=\"" + WLMFunctions.comillas(SKU) + "\"");
            strCommand.Append(",Clave=\"" + WLMFunctions.comillas(Clave) + "\"");
            strCommand.Append(",Descripcion=\"" + WLMFunctions.comillas(Descripcion) + "\"");
            strCommand.Append(",Precio1=\"" + WLMFunctions.comillas(Precio1) + "\"");
            strCommand.Append(",Precio2=\"" + WLMFunctions.comillas(Precio2) + "\"");
            strCommand.Append(",Precio3=\"" + WLMFunctions.comillas(Precio3) + "\"");
            strCommand.Append(",Precio4=\"" + WLMFunctions.comillas(Precio4) + "\"");
            strCommand.Append(",Precio5=\"" + WLMFunctions.comillas(Precio5) + "\"");
            strCommand.Append(",Stock=\"" + WLMFunctions.comillas(Stock) + "\"");
            strCommand.Append(",StockMinimo=\"" + WLMFunctions.comillas(StockMinimo) + "\"");
            strCommand.Append(",StockMaximo=\"" + WLMFunctions.comillas(StockMaximo) + "\"");
            strCommand.Append(",UltimoPrecioCompra=\"" + WLMFunctions.comillas(UltimoPrecioCompra) + "\"");
            strCommand.Append(",costoPromedio=\"" + WLMFunctions.comillas(costoPromedio) + "\"");
            strCommand.Append(",UnidadMedida=\"" + WLMFunctions.comillas(UnidadMedida) + "\"");
            strCommand.Append(",idLinea='" + this.idLinea.ToString() + "'");
            strCommand.Append(",idCategoria='" + this.idCategoria.ToString() + "'");
            strCommand.Append(",Apartados=\"" + WLMFunctions.comillas(Apartados) + "\"");
            strCommand.Append(",idImagen='" + this.idImagen.ToString() + "'");
            strCommand.Append(",Activo='" + Convert.ToInt16(Activo) + "'");
            strCommand.Append(",EsMateriaPrima='" + Convert.ToInt16(EsMateriaPrima) + "'");
            strCommand.Append(",EsProductoTerminado='" + Convert.ToInt16(EsProductoTerminado) + "'");
            strCommand.Append(",EsPaquete='" + Convert.ToInt16(EsPaquete) + "'");
            strCommand.Append(",peso=\"" + WLMFunctions.comillas(Peso) + "\"");
            strCommand.Append(",porSurtir=\"" + WLMFunctions.comillas(PorSurtir) + "\"");
            strCommand.Append(",id2='" + this.id2.ToString() + "'");
            strCommand.Append(" WHERE id='" + this.id + "'");
            ConexionDBInterna.ExecuteCommand(strCommand.ToString());
        }
        #endregion
    }

    [Serializable]
    public class ProductoCollection
    {
        
        private List<Producto> items;
        [XmlElement("Producto")]
        public List<Producto> Elementos { get;set; }
        public ProductoCollection()
        {
        }
        public ProductoCollection(ref dbConnector ConexionDB)
        {
  
            string strCommand = "SELECT id FROM PRODUCTOS WHERE activo='1' ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            items = new List<Producto>();
            while (dataReader.Read())
            {
                Producto newItem = new Producto(Convert.ToInt32(dataReader["id"]), true,ref ConexionDB);
                items.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }

        public ProductoCollection(bool ordenadas, ref dbConnector ConexionDB)
        {

            string strCommand = "SELECT id FROM PRODUCTOS WHERE activo='1' ORDER BY descripcion ASC";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            items = new List<Producto>();
            while (dataReader.Read())
            {
                Producto newItem = new Producto(Convert.ToInt32(dataReader["id"]), true, ref ConexionDB);
                items.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }

        public ProductoCollection(string tipoProducto,ref dbConnector ConexionDB)
        {

            string strCommand = "SELECT id FROM PRODUCTOS WHERE " + tipoProducto + "='1' AND activo='1' ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            items = new List<Producto>();
            while (dataReader.Read())
            {
                Producto newItem = new Producto(Convert.ToInt32(dataReader["id"]), true,ref ConexionDB);
                items.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }

        public ProductoCollection(string tipoProducto, Proveedor proveedor,ref dbConnector ConexionDB)
        {

            string strCommand = "SELECT PRO.id FROM PRODUCTOS PRO LEFT JOIN PRODUCTO2PROVEEDOR PROV ON  PROV.idProducto=PRO.id WHERE " + tipoProducto + "='1' AND PRO.activo='1' AND PROV.idProveedor='" + proveedor.id + "'";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            items = new List<Producto>();
            while (dataReader.Read())
            {
                Producto newItem = new Producto(Convert.ToInt32(dataReader["id"]), true,ref ConexionDB);
                items.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }

        public ProductoCollection(Proveedor proveedor,ref dbConnector ConexionDB)
        {

            string strCommand = "SELECT PRO.id,PROV.PrecioProveedor FROM PRODUCTOS PRO LEFT JOIN PRODUCTO2PROVEEDOR PROV ON  PROV.idProducto=PRO.id WHERE PRO.activo='1' AND PROV.idProveedor='" + proveedor.id + "'";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            items = new List<Producto>();
            while (dataReader.Read())
            {
                Producto newItem = new Producto(Convert.ToInt32(dataReader["id"]), true,ref ConexionDB);
                newItem.UltimoPrecioCompra = Convert.ToDecimal(dataReader["PrecioProveedor"]);
                items.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }


        public ProductoCollection(ProductoCategoria categoria, string tipoProducto,ref dbConnector ConexionDB)
        {

            string strCommand = "SELECT id FROM PRODUCTOS WHERE idCategoria='" + categoria.id + "' AND " + tipoProducto + "='1' AND activo='1' ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            items = new List<Producto>();
            while (dataReader.Read())
            {
                Producto newItem = new Producto(Convert.ToInt32(dataReader["id"]), true,ref ConexionDB);
                items.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }

        public ProductoCollection(ProductoCategoria categoria, string tipoProducto, bool incluirIVA,ref dbConnector ConexionDB)
        {

            string strCommand = "SELECT id FROM PRODUCTOS WHERE idCategoria='" + categoria.id + "' AND " + tipoProducto + "='1' AND activo='1' ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            items = new List<Producto>();
            while (dataReader.Read())
            {
                Producto newItem = new Producto(Convert.ToInt32(dataReader["id"]), true, incluirIVA,ref ConexionDB);
                items.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }

        public ProductoCollection(string busqueda, string tipoProducto, ref dbConnector ConexionDB)
        {

            string strCommand = "SELECT id FROM PRODUCTOS WHERE clave like'%" + busqueda + "%' OR descripcion LIKE '%" + tipoProducto + "%' AND activo='1' ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            items = new List<Producto>();
            while (dataReader.Read())
            {
                Producto newItem = new Producto(Convert.ToInt32(dataReader["id"]), true, ref ConexionDB);
                items.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }
    }

    public class ProductoStock : BaseClass
    {


        #region public properties
        public Decimal Stock { get;set; }
        public Decimal Apartados { get;set; }
        public Decimal porSurtir { get;set; }
        public int idProducto { get;set; }
        public int idAlmacen { get;set; }
        #endregion

        #region constructors
        public ProductoStock()
        {
        }

        public ProductoStock(ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            WLMClassBinder classBinder = new WLMClassBinder(ref ConexionDB);
            id = classBinder.NewRecord("PRODUCTOSTOCK");
            string queryString = "";
            queryString = "SELECT * FROM PRODUCTOSTOCK WHERE id='" + this.id + "'";
            GetRecord(queryString);
        }

        public ProductoStock(int registryId,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM PRODUCTOSTOCK WHERE id='" + registryId + "'";
            WLMClassBinder classBinder = new WLMClassBinder(ref ConexionDB);
            this.GetRecord(queryString);
        }

        public ProductoStock(Producto producto,Almacen almacen,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM PRODUCTOSTOCK WHERE idProducto='" + producto.id + "' AND idAlmacen='" + almacen.id + "'";
            
            this.GetRecord(queryString);
            if (id == 0)
            {
                WLMClassBinder classBinder = new WLMClassBinder(ref ConexionDB);
                id = classBinder.NewRecord("PRODUCTOSTOCK");
                queryString = "SELECT * FROM PRODUCTOSTOCK WHERE id='" + this.id + "'";
                GetRecord(queryString);
                idAlmacen = almacen.id;
                idProducto = producto.id;
                Save();
            }
        }

        public ProductoStock(DataRow dataRow,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            this.GetRecord(dataRow);
        }
        #endregion

        #region public methods


        public void Delete()
        {
            string queryString = "";
            queryString = "DELETE FROM PRODUCTOSTOCK WHERE id='" + this.id + "'";
            ConexionDBInterna.ExecuteCommand(queryString);

        }
        #endregion


        #region Private Methods
        private void GetRecord(string queryString)
        {
            OdbcDataReader reader = ConexionDBInterna.ExecuteReader(queryString);
            if (reader.HasRows)
            {
                if (!reader.IsDBNull(reader.GetOrdinal("id")))
                    id = (System.Int32)reader["id"];
                if (!reader.IsDBNull(reader.GetOrdinal("fechaCreacion")))
                    fechaCreacion = Convert.ToDateTime(reader["fechaCreacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("fechaModificacion")))
                    fechaModificacion = Convert.ToDateTime(reader["fechaModificacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuario")))
                    idUsuario = (System.Int32)reader["idUsuario"];
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuarioModificacion")))
                    idUsuarioModificacion = (System.Int32)reader["idUsuarioModificacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("Stock")))
                    Stock = (System.Decimal)reader["Stock"];
                if (!reader.IsDBNull(reader.GetOrdinal("Apartados")))
                    Apartados = (System.Decimal)reader["Apartados"];
                if (!reader.IsDBNull(reader.GetOrdinal("porSurtir")))
                    porSurtir = (System.Decimal)reader["porSurtir"];
                if (!reader.IsDBNull(reader.GetOrdinal("idProducto")))
                    idProducto = (System.Int32)reader["idProducto"];
                if (!reader.IsDBNull(reader.GetOrdinal("idAlmacen")))
                    idAlmacen = (System.Int32)reader["idAlmacen"];
            }
        }


        private void GetRecord(DataRow dataRow)
        {
            if (dataRow != null)
            {
                if (dataRow["id"] != null)
                    id = (System.Int32)dataRow["id"];
                if (dataRow["fechaCreacion"] != null)
                    fechaCreacion = (System.DateTime)dataRow["fechaCreacion"];
                if (dataRow["fechaModificacion"] != null)
                    fechaModificacion = (System.DateTime)dataRow["fechaModificacion"];
                if (dataRow["idUsuario"] != null)
                    idUsuario = (System.Int32)dataRow["idUsuario"];
                if (dataRow["idUsuarioModificacion"] != null)
                    idUsuarioModificacion = (System.Int32)dataRow["idUsuarioModificacion"];
                if (dataRow["Stock"] != null)
                    Stock = (System.Decimal)dataRow["Stock"];
                if (dataRow["Apartados"] != null)
                    Apartados = (System.Decimal)dataRow["Apartados"];
                if (dataRow["porSurtir"] != null)
                    porSurtir = (System.Decimal)dataRow["porSurtir"];
                if (dataRow["idProducto"] != null)
                    idProducto = (System.Int32)dataRow["idProducto"];
                if (dataRow["idAlmacen"] != null)
                    idAlmacen = (System.Int32)dataRow["idAlmacen"];
            }
        }


        protected override void UpdateBind()
        {
            StringBuilder strCommand = new StringBuilder();
            strCommand.Append("UPDATE PRODUCTOSTOCK set ");
            strCommand.Append("fechaModificacion='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",idUsuarioModificacion='" + this.idUsuarioModificacion.ToString() + "'");
            strCommand.Append(",Stock=\"" + WLMFunctions.comillas(Stock) + "\"");
            strCommand.Append(",Apartados=\"" + WLMFunctions.comillas(Apartados) + "\"");
            strCommand.Append(",porSurtir=\"" + WLMFunctions.comillas(porSurtir) + "\"");
            strCommand.Append(",idProducto='" + this.idProducto.ToString() + "'");
            strCommand.Append(",idAlmacen='" + this.idAlmacen.ToString() + "'");
            strCommand.Append(" WHERE id='" + this.id + "'");
            ConexionDBInterna.ExecuteCommand(strCommand.ToString());
        }
        #endregion
    }

    public class ProductoStockCollection
    {
        
        private List<ProductoStock> items;
        public List<ProductoStock> Elementos { get;set; }
        public ProductoStockCollection()
        {
        }
        public ProductoStockCollection(ref dbConnector ConexionDB)
        {
          
            string strCommand = "SELECT id FROM PRODUCTOSTOCK ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            items = new List<ProductoStock>();
            while (dataReader.Read())
            {
                ProductoStock newItem = new ProductoStock(Convert.ToInt32(dataReader["id"]),ref ConexionDB);
                items.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }

        public ProductoStockCollection(Producto producto,ref dbConnector ConexionDB)
        {
         
            string strCommand = "SELECT id FROM PRODUCTOSTOCK WHERE idProducto='" + producto.id + "'";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            items = new List<ProductoStock>();
            while (dataReader.Read())
            {
                ProductoStock newItem = new ProductoStock(Convert.ToInt32(dataReader["id"]),ref ConexionDB);
                items.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }
    }

    [Serializable]
    [XmlType("Categoria")]
    public class CategoriaProductoLista
    {
        private List<Producto> productos;
        private string nombreCategoria;
        private int idCategoria;
        private int idCategoria2;

        [XmlAttribute()]
        public String NombreCategoria { get;set; }
        [XmlAttribute()]
        public int Id { get;set; }
        [XmlAttribute()]
        public int Id2 { get;set; }
        [XmlElement("Producto")]
        public List<Producto> Productos { get;set; }


        public CategoriaProductoLista()
        {
        }

        public CategoriaProductoLista(ProductoCategoria categoria,ref dbConnector ConexionDB)
        {
            productos = new List<Producto>();
            nombreCategoria = categoria.NombreCategoria;
            idCategoria = categoria.id;
            ProductoCollection products = new ProductoCollection(categoria, "esProductoTerminado",ref ConexionDB);
            foreach (Producto prod in products.Elementos)
            {

                productos.Add(prod);

            }

        }

        public CategoriaProductoLista(ProductoCategoria categoria, bool incluirIVA,ref dbConnector ConexionDB)
        {
            productos = new List<Producto>();
            nombreCategoria = categoria.NombreCategoria;
            idCategoria = categoria.id;
            ProductoCollection products = new ProductoCollection(categoria, "esProductoTerminado", incluirIVA,ref ConexionDB);
            foreach (Producto prod in products.Elementos)
            {

                productos.Add(prod);

            }

        }


    }

    [Serializable]
    public class ListaPrecios
    {
        [XmlAttribute()]
        public DateTime FechaGeneracion { get;set; }
        [XmlElement("Categoria")]
        public List<CategoriaProductoLista> Categorias
        {
            get;set;
        }

        public ListaPrecios()
        {
        }

        public string XMLListaPrecios(bool incluirIVA,ref dbConnector ConexionDB)
        {
            StringBuilder salida = new StringBuilder();
            XmlSerializer serializer = new XmlSerializer(typeof(ListaPrecios));
            FechaGeneracion = DateTime.Now;
            string rutaArchivos = "";
            string nombreArchivo = "ListaProductos" + FechaGeneracion.ToString("yyyyMMdd");


            rutaArchivos += "ListaPreciosXML/";
            DirectoryInfo directorio = new DirectoryInfo(ConfigurationManager.AppSettings["sitePath"] + rutaArchivos);
            if (!directorio.Exists)
                directorio.Create();


            Categorias = new List<CategoriaProductoLista>();
            ProductoCategoriaCollection categorias = new ProductoCategoriaCollection(ref ConexionDB);
            foreach (ProductoCategoria cat in categorias.Elementos)
            {
                Categorias.Add(new CategoriaProductoLista(cat, incluirIVA,ref ConexionDB));
            }


            string archivo = ConfigurationManager.AppSettings["sitePath"] + rutaArchivos + nombreArchivo + ".xml";
            TextWriter tw = new StreamWriter(archivo);
            serializer.Serialize(tw, this);
            tw.Close();

            return nombreArchivo;
        }
    }

    public class ProductoMarca : BaseClass
    {

        #region public properties
        public int idImagen { get;set; }
        public String NombreMarca { get;set; }
        #endregion

        #region constructors
        public ProductoMarca()
        { }
        public ProductoMarca(ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            WLMClassBinder classBinder = new WLMClassBinder(ref ConexionDB);
            id = classBinder.NewRecord("PRODUCTOMARCA");
            string queryString = "";
            queryString = "SELECT * FROM PRODUCTOMARCA WHERE id='" + this.id + "'";
            GetRecord(queryString);
        }

        public ProductoMarca(int registryId,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM PRODUCTOMARCA WHERE id='" + registryId + "'";

            this.GetRecord(queryString);
        }

        public ProductoMarca(string Marca,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM PRODUCTOMARCA WHERE LOWER(NombreMarca)='" + Marca + "'";

            this.GetRecord(queryString);
        }

        public ProductoMarca(DataRow dataRow,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            this.GetRecord(dataRow);
        }
        #endregion

        #region public methods


        public void Delete()
        {
            string queryString = "";
            queryString = "DELETE FROM PRODUCTOMARCA WHERE id='" + this.id + "'";
            ConexionDBInterna.ExecuteCommand(queryString);

        }
        #endregion


        #region Private Methods
        private void GetRecord(string queryString)
        {
            OdbcDataReader reader = ConexionDBInterna.ExecuteReader(queryString);
            if (reader.HasRows)
            {
                if (!reader.IsDBNull(reader.GetOrdinal("id")))
                    id = (System.Int32)reader["id"];
                if (!reader.IsDBNull(reader.GetOrdinal("fechaCreacion")))
                    fechaCreacion = Convert.ToDateTime(reader["fechaCreacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("fechaModificacion")))
                    fechaModificacion = Convert.ToDateTime(reader["fechaModificacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuario")))
                    idUsuario = (System.Int32)reader["idUsuario"];
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuarioModificacion")))
                    idUsuarioModificacion = (System.Int32)reader["idUsuarioModificacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("idImagen")))
                    idImagen = (System.Int32)reader["idImagen"];
                if (!reader.IsDBNull(reader.GetOrdinal("NombreMarca")))
                    NombreMarca = (System.String)reader["NombreMarca"];
            }
        }


        private void GetRecord(DataRow dataRow)
        {
            if (dataRow != null)
            {
                if (dataRow["id"] != null)
                    id = (System.Int32)dataRow["id"];
                if (dataRow["fechaCreacion"] != null)
                    fechaCreacion = (System.DateTime)dataRow["fechaCreacion"];
                if (dataRow["fechaModificacion"] != null)
                    fechaModificacion = (System.DateTime)dataRow["fechaModificacion"];
                if (dataRow["idUsuario"] != null)
                    idUsuario = (System.Int32)dataRow["idUsuario"];
                if (dataRow["idUsuarioModificacion"] != null)
                    idUsuarioModificacion = (System.Int32)dataRow["idUsuarioModificacion"];
                if (dataRow["idImagen"] != null)
                    idImagen = (System.Int32)dataRow["idImagen"];
                if (dataRow["NombreMarca"] != null)
                    NombreMarca = (System.String)dataRow["NombreMarca"];
            }
        }


        protected override void UpdateBind()
        {
            StringBuilder strCommand = new StringBuilder();
            strCommand.Append("UPDATE PRODUCTOMARCA set ");
            strCommand.Append("fechaModificacion='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",idUsuarioModificacion='" + this.idUsuarioModificacion.ToString() + "'");
            strCommand.Append(",idImagen='" + this.idImagen.ToString() + "'");
            strCommand.Append(",NombreMarca=\"" + WLMFunctions.comillas(NombreMarca) + "\"");
            strCommand.Append(" WHERE id='" + this.id + "'");
            ConexionDBInterna.ExecuteCommand(strCommand.ToString());
        }
        #endregion
    }

    public class ProductoMarcaCollection
    {
        
        private List<ProductoMarca> items;
        public List<ProductoMarca> Elementos { get;set; }
        public ProductoMarcaCollection()
        {
        }
        public ProductoMarcaCollection(ref dbConnector ConexionDB)
        {
          
            string strCommand = "SELECT id FROM PRODUCTOMARCA ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            items = new List<ProductoMarca>();
            while (dataReader.Read())
            {
                ProductoMarca newItem = new ProductoMarca(Convert.ToInt32(dataReader["id"]),ref ConexionDB);
                items.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }
    }

    public class ProductoCategoria : BaseClass
    {
        

        #region public properties
        public String NombreCategoria { get;set; }
        #endregion

        #region constructors
        public ProductoCategoria()
        { }
        public ProductoCategoria(ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            WLMClassBinder classBinder = new WLMClassBinder(ref ConexionDB);
            id = classBinder.NewRecord("PRODUCTOCATEGORIA");
            string queryString = "";
            queryString = "SELECT * FROM PRODUCTOCATEGORIA WHERE id='" + this.id + "'";
            GetRecord(queryString);
        }

        public ProductoCategoria(int registryId,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM PRODUCTOCATEGORIA WHERE id='" + registryId + "'";

            this.GetRecord(queryString);
        }

        public ProductoCategoria(string Categoria,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM PRODUCTOCATEGORIA WHERE LOWER(NombreCategoria)='" + Categoria + "'";

            this.GetRecord(queryString);
        }

        public ProductoCategoria(DataRow dataRow,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            this.GetRecord(dataRow);
        }
        #endregion

        #region public methods


        public void Delete()
        {
            string queryString = "";
            queryString = "DELETE FROM PRODUCTOCATEGORIA WHERE id='" + this.id + "'";
            ConexionDBInterna.ExecuteCommand(queryString);

        }
        #endregion


        #region Private Methods
        private void GetRecord(string queryString)
        {
            OdbcDataReader reader = ConexionDBInterna.ExecuteReader(queryString);
            if (reader.HasRows)
            {
                if (!reader.IsDBNull(reader.GetOrdinal("id")))
                    id = (System.Int32)reader["id"];
                if (!reader.IsDBNull(reader.GetOrdinal("fechaCreacion")))
                    fechaCreacion = Convert.ToDateTime(reader["fechaCreacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("fechaModificacion")))
                    fechaModificacion = Convert.ToDateTime(reader["fechaModificacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuario")))
                    idUsuario = (System.Int32)reader["idUsuario"];
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuarioModificacion")))
                    idUsuarioModificacion = (System.Int32)reader["idUsuarioModificacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("NombreCategoria")))
                    NombreCategoria = (System.String)reader["NombreCategoria"];
            }
        }


        private void GetRecord(DataRow dataRow)
        {
            if (dataRow != null)
            {
                if (dataRow["id"] != null)
                    id = (System.Int32)dataRow["id"];
                if (dataRow["fechaCreacion"] != null)
                    fechaCreacion = (System.DateTime)dataRow["fechaCreacion"];
                if (dataRow["fechaModificacion"] != null)
                    fechaModificacion = (System.DateTime)dataRow["fechaModificacion"];
                if (dataRow["idUsuario"] != null)
                    idUsuario = (System.Int32)dataRow["idUsuario"];
                if (dataRow["idUsuarioModificacion"] != null)
                    idUsuarioModificacion = (System.Int32)dataRow["idUsuarioModificacion"];
                if (dataRow["NombreCategoria"] != null)
                    NombreCategoria = (System.String)dataRow["NombreCategoria"];
            }
        }


        protected override void UpdateBind()
        {
            StringBuilder strCommand = new StringBuilder();
            strCommand.Append("UPDATE PRODUCTOCATEGORIA set ");
            strCommand.Append("fechaModificacion='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",idUsuarioModificacion='" + this.idUsuarioModificacion.ToString() + "'");
            strCommand.Append(",NombreCategoria=\"" + WLMFunctions.comillas(NombreCategoria) + "\"");
            strCommand.Append(" WHERE id='" + this.id + "'");
            ConexionDBInterna.ExecuteCommand(strCommand.ToString());
        }
        #endregion
    }

    public class ProductoCategoriaCollection
    {
        
        private List<ProductoCategoria> items;
        public List<ProductoCategoria> Elementos { get;set; }
        public ProductoCategoriaCollection()
        {
        }
        public ProductoCategoriaCollection(ref dbConnector ConexionDB)
        {
           
            string strCommand = "SELECT id FROM PRODUCTOCATEGORIA ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            items = new List<ProductoCategoria>();
            while (dataReader.Read())
            {
                ProductoCategoria newItem = new ProductoCategoria(Convert.ToInt32(dataReader["id"]),ref ConexionDB);
                items.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }
    }

    public class ProductoLinea : BaseClass
    {

        #region public properties
        public String NombreLinea { get;set; }
        #endregion

        #region constructors
        public ProductoLinea()
        { }
        public ProductoLinea(ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            WLMClassBinder classBinder = new WLMClassBinder(ref ConexionDB);
            id = classBinder.NewRecord("PRODUCTOLINEA");
            string queryString = "";
            queryString = "SELECT * FROM PRODUCTOLINEA WHERE id='" + this.id + "'";
            GetRecord(queryString);
        }

        public ProductoLinea(int registryId,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM PRODUCTOLINEA WHERE id='" + registryId + "'";

            this.GetRecord(queryString);
        }

        public ProductoLinea(string Linea,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM PRODUCTOLINEA WHERE LOWER(NombreLinea)='" + Linea + "'";

            this.GetRecord(queryString);
        }

        public ProductoLinea(DataRow dataRow,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            this.GetRecord(dataRow);
        }
        #endregion

        #region public methods


        public void Delete()
        {
            string queryString = "";
            queryString = "DELETE FROM PRODUCTOLINEA WHERE id='" + this.id + "'";
            ConexionDBInterna.ExecuteCommand(queryString);

        }
        #endregion

        #region Private Methods
        private void GetRecord(string queryString)
        {
            OdbcDataReader reader = ConexionDBInterna.ExecuteReader(queryString);
            if (reader.HasRows)
            {
                if (!reader.IsDBNull(reader.GetOrdinal("id")))
                    id = (System.Int32)reader["id"];
                if (!reader.IsDBNull(reader.GetOrdinal("fechaCreacion")))
                    fechaCreacion = Convert.ToDateTime(reader["fechaCreacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("fechaModificacion")))
                    fechaModificacion = Convert.ToDateTime(reader["fechaModificacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuario")))
                    idUsuario = (System.Int32)reader["idUsuario"];
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuarioModificacion")))
                    idUsuarioModificacion = (System.Int32)reader["idUsuarioModificacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("NombreLinea")))
                    NombreLinea = (System.String)reader["NombreLinea"];
            }
        }


        private void GetRecord(DataRow dataRow)
        {
            if (dataRow != null)
            {
                if (dataRow["id"] != null)
                    id = (System.Int32)dataRow["id"];
                if (dataRow["fechaCreacion"] != null)
                    fechaCreacion = (System.DateTime)dataRow["fechaCreacion"];
                if (dataRow["fechaModificacion"] != null)
                    fechaModificacion = (System.DateTime)dataRow["fechaModificacion"];
                if (dataRow["idUsuario"] != null)
                    idUsuario = (System.Int32)dataRow["idUsuario"];
                if (dataRow["idUsuarioModificacion"] != null)
                    idUsuarioModificacion = (System.Int32)dataRow["idUsuarioModificacion"];
                if (dataRow["NombreLinea"] != null)
                    NombreLinea = (System.String)dataRow["NombreLinea"];
            }
        }


        protected override void UpdateBind()
        {
            StringBuilder strCommand = new StringBuilder();
            strCommand.Append("UPDATE PRODUCTOLINEA set ");
            strCommand.Append("fechaModificacion='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",idUsuarioModificacion='" + this.idUsuarioModificacion.ToString() + "'");
            strCommand.Append(",NombreLinea=\"" + WLMFunctions.comillas(NombreLinea) + "\"");
            strCommand.Append(" WHERE id='" + this.id + "'");
            ConexionDBInterna.ExecuteCommand(strCommand.ToString());
        }
        #endregion
    }

    public class ProductoLineaCollection
    {
        
        private List<ProductoLinea> items;
        public List<ProductoLinea> Elementos { get;set; }
        public ProductoLineaCollection()
        {
        }
        public ProductoLineaCollection(ref dbConnector ConexionDB)
        {
            
            string strCommand = "SELECT id FROM PRODUCTOLINEA ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            items = new List<ProductoLinea>();
            while (dataReader.Read())
            {
                ProductoLinea newItem = new ProductoLinea(Convert.ToInt32(dataReader["id"]),ref ConexionDB);
                items.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }
    }

    public class MovimientoStock : BaseClass
    {


        #region public properties
        public Decimal stockInicial { get;set; }
        public Decimal stockFinal { get;set; }
        public Boolean entrada { get;set; }
        public Boolean salida { get;set; }
        public DateTime fechaAplicacion { get;set; }
        public int idVenta { get;set; }
        public int idCliente { get;set; }
        public int idProveedor { get;set; }
        public int idCompra { get;set; }
        public int TipoMovimiento { get;set; }
        public int idProducto { get;set; }
        public int idAlmacen { get;set; }
        public Decimal cantidadEntrada { get;set; }
        public Decimal cantidadSalida { get;set; }
        #endregion

        #region constructors
        public MovimientoStock(ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            WLMClassBinder classBinder = new WLMClassBinder(ref ConexionDB);
            id = classBinder.NewRecord("PRODUCTOSSTOCKMOVIMIENTOS");
            string queryString = "";
            queryString = "SELECT * FROM PRODUCTOSSTOCKMOVIMIENTOS WHERE id='" + this.id + "'";
            GetRecord(queryString);
        }

        public MovimientoStock(int registryId,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM PRODUCTOSSTOCKMOVIMIENTOS WHERE id='" + registryId + "'";
            WLMClassBinder classBinder = new WLMClassBinder(ref ConexionDB);
            this.GetRecord(queryString);
        }
        public MovimientoStock(DataRow dataRow,ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            this.GetRecord(dataRow);
        }
        #endregion

        #region public methods


        public void Delete()
        {
            string queryString = "";
            queryString = "DELETE FROM PRODUCTOSSTOCKMOVIMIENTOS WHERE id='" + this.id + "'";
            ConexionDBInterna.ExecuteCommand(queryString);

        }

        

        #endregion


        #region Private Methods
        private void GetRecord(string queryString)
        {
            OdbcDataReader reader = ConexionDBInterna.ExecuteReader(queryString);
            if (reader.HasRows)
            {
                if (!reader.IsDBNull(reader.GetOrdinal("id")))
                    id = (System.Int32)reader["id"];
                if (!reader.IsDBNull(reader.GetOrdinal("fechaCreacion")))
                    fechaCreacion = Convert.ToDateTime(reader["fechaCreacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("fechaModificacion")))
                    fechaModificacion = Convert.ToDateTime(reader["fechaModificacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuario")))
                    idUsuario = (System.Int32)reader["idUsuario"];
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuarioModificacion")))
                    idUsuarioModificacion = (System.Int32)reader["idUsuarioModificacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("stockInicial")))
                    stockInicial = (System.Decimal)reader["stockInicial"];
                if (!reader.IsDBNull(reader.GetOrdinal("stockFinal")))
                    stockFinal = (System.Decimal)reader["stockFinal"];
                if (!reader.IsDBNull(reader.GetOrdinal("entrada")))
                    entrada = Convert.ToBoolean(reader["entrada"]);
                if (!reader.IsDBNull(reader.GetOrdinal("salida")))
                    salida = Convert.ToBoolean(reader["salida"]);
                if (!reader.IsDBNull(reader.GetOrdinal("fechaAplicacion")))
                    fechaAplicacion = Convert.ToDateTime(reader["fechaAplicacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("idCotizacion")))
                    idVenta = (System.Int32)reader["idCotizacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("idCliente")))
                    idCliente = (System.Int32)reader["idCliente"];
                if (!reader.IsDBNull(reader.GetOrdinal("idProveedor")))
                    idProveedor = (System.Int32)reader["idProveedor"];
                if (!reader.IsDBNull(reader.GetOrdinal("idCompra")))
                    idCompra = (System.Int32)reader["idCompra"];
                if (!reader.IsDBNull(reader.GetOrdinal("TipoMovimiento")))
                    TipoMovimiento = (System.Int32)reader["TipoMovimiento"];
                if (!reader.IsDBNull(reader.GetOrdinal("idProducto")))
                    idProducto = (System.Int32)reader["idProducto"];
                if (!reader.IsDBNull(reader.GetOrdinal("idAlmacen")))
                    idAlmacen = (System.Int32)reader["idAlmacen"];
                if (!reader.IsDBNull(reader.GetOrdinal("cantidadEntrada")))
                    cantidadEntrada = (System.Decimal)reader["cantidadEntrada"];
                if (!reader.IsDBNull(reader.GetOrdinal("cantidadSalida")))
                    cantidadSalida = (System.Decimal)reader["cantidadSalida"];
            }
        }


        private void GetRecord(DataRow dataRow)
        {
            if (dataRow != null)
            {
                if (dataRow["id"] != null)
                    id = (System.Int32)dataRow["id"];
                if (dataRow["fechaCreacion"] != null)
                    fechaCreacion = (System.DateTime)dataRow["fechaCreacion"];
                if (dataRow["fechaModificacion"] != null)
                    fechaModificacion = (System.DateTime)dataRow["fechaModificacion"];
                if (dataRow["idUsuario"] != null)
                    idUsuario = (System.Int32)dataRow["idUsuario"];
                if (dataRow["idUsuarioModificacion"] != null)
                    idUsuarioModificacion = (System.Int32)dataRow["idUsuarioModificacion"];
                if (dataRow["stockInicial"] != null)
                    stockInicial = (System.Decimal)dataRow["stockInicial"];
                if (dataRow["stockFinal"] != null)
                    stockFinal = (System.Decimal)dataRow["stockFinal"];
                if (dataRow["entrada"] != null)
                    entrada = (bool)dataRow["entrada"];
                if (dataRow["salida"] != null)
                    salida = (bool)dataRow["salida"];
                if (dataRow["fechaAplicacion"] != null)
                    fechaAplicacion = (System.DateTime)dataRow["fechaAplicacion"];
                if (dataRow["idCotizacion"] != null)
                    idVenta = (System.Int32)dataRow["idCotizacion"];
                if (dataRow["idCliente"] != null)
                    idCliente = (System.Int32)dataRow["idCliente"];
                if (dataRow["idProveedor"] != null)
                    idProveedor = (System.Int32)dataRow["idProveedor"];
                if (dataRow["idCompra"] != null)
                    idCompra = (System.Int32)dataRow["idCompra"];
                if (dataRow["TipoMovimiento"] != null)
                    TipoMovimiento = (System.Int32)dataRow["TipoMovimiento"];
                if (dataRow["idProducto"] != null)
                    idProducto = (System.Int32)dataRow["idProducto"];
                if (dataRow["idAlmacen"] != null)
                    idAlmacen = (System.Int32)dataRow["idAlmacen"];
                if (dataRow["cantidadEntrada"] != null)
                    cantidadEntrada = (System.Decimal)dataRow["cantidadEntrada"];
                if (dataRow["cantidadSalida"] != null)
                    cantidadSalida = (System.Decimal)dataRow["cantidadSalida"];
            }
        }


        protected override void UpdateBind()
        {
            StringBuilder strCommand = new StringBuilder();
            strCommand.Append("UPDATE PRODUCTOSSTOCKMOVIMIENTOS set ");
            strCommand.Append("fechaModificacion='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",idUsuarioModificacion='" + this.idUsuarioModificacion.ToString() + "'");
            strCommand.Append(",stockInicial=\"" + WLMFunctions.comillas(stockInicial) + "\"");
            strCommand.Append(",stockFinal=\"" + WLMFunctions.comillas(stockFinal) + "\"");
            strCommand.Append(",entrada='" + Convert.ToInt16(entrada) + "'");
            strCommand.Append(",salida='" + Convert.ToInt16(salida) + "'");
            strCommand.Append(",fechaAplicacion='" + this.fechaAplicacion.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",idCotizacion='" + this.idVenta.ToString() + "'");
            strCommand.Append(",idCliente='" + this.idCliente.ToString() + "'");
            strCommand.Append(",idProveedor='" + this.idProveedor.ToString() + "'");
            strCommand.Append(",idCompra='" + this.idCompra.ToString() + "'");
            strCommand.Append(",TipoMovimiento='" + this.TipoMovimiento.ToString() + "'");
            strCommand.Append(",idProducto='" + this.idProducto.ToString() + "'");
            strCommand.Append(",idAlmacen='" + this.idAlmacen.ToString() + "'");
            strCommand.Append(",cantidadEntrada=\"" + WLMFunctions.comillas(cantidadEntrada) + "\"");
            strCommand.Append(",cantidadSalida=\"" + WLMFunctions.comillas(cantidadSalida) + "\"");
            strCommand.Append(" WHERE id='" + this.id + "'");
            ConexionDBInterna.ExecuteCommand(strCommand.ToString());
        }
        #endregion
    }




    public class MovimientoStockCollection
    {
        
        private List<MovimientoStock> items;
        public List<MovimientoStock> Elementos { get;set; }
        public MovimientoStockCollection()
        {
        }
        public MovimientoStockCollection(ref dbConnector ConexionDB)
        {
            
            string strCommand = "SELECT id FROM PRODUCTOSSTOCKMOVIMIENTOS ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            items = new List<MovimientoStock>();
            while (dataReader.Read())
            {
                MovimientoStock newItem = new MovimientoStock(Convert.ToInt32(dataReader["id"]),ref ConexionDB);
                items.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }
    }
}
